home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcl / src-16f.lha / ldb / dynbind.c < prev    next >
C/C++ Source or Header  |  1991-11-06  |  1KB  |  70 lines

  1. /*
  2.  * $Header: dynbind.c,v 1.3 91/02/16 00:59:56 wlott Exp $
  3.  * 
  4.  * Support for dynamic binding from C.
  5.  */
  6.  
  7. #include "ldb.h"
  8. #include "lisp.h"
  9. #include "globals.h"
  10.  
  11. #ifdef ibmrt
  12. #define GetBSP() ((struct binding *)SymbolValue(BINDING_STACK_POINTER))
  13. #define SetBSP(value) SetSymbolValue(BINDING_STACK_POINTER, (lispobj)(value))
  14. #else
  15. #define GetBSP() ((struct binding *)current_binding_stack_pointer)
  16. #define SetBSP(value) (current_binding_stack_pointer=(lispobj *)(value))
  17. #endif
  18.  
  19. bind_variable(symbol, value)
  20. lispobj symbol, value;
  21. {
  22.     lispobj old_value;
  23.     struct binding *binding;
  24.  
  25.     old_value = SymbolValue(symbol);
  26.     binding = GetBSP();
  27.     SetBSP(binding+1);
  28.  
  29.     binding->value = old_value;
  30.     binding->symbol = symbol;
  31.     SetSymbolValue(symbol, value);
  32. }
  33.  
  34. unbind()
  35. {
  36.     struct binding *binding;
  37.     lispobj symbol;
  38.     
  39.     binding = GetBSP() - 1;
  40.         
  41.     symbol = binding->symbol;
  42.  
  43.     SetSymbolValue(symbol, binding->value);
  44.  
  45.     binding->symbol = 0;
  46.  
  47.     SetBSP(binding);
  48. }
  49.  
  50. unbind_to_here(bsp)
  51. lispobj *bsp;
  52. {
  53.     struct binding *target = (struct binding *)bsp;
  54.     struct binding *binding = GetBSP();
  55.     lispobj symbol;
  56.  
  57.     while (target < binding) {
  58.     binding--;
  59.  
  60.     symbol = binding->symbol;
  61.  
  62.     if (symbol) {
  63.         SetSymbolValue(symbol, binding->value);
  64.         binding->symbol = 0;
  65.     }
  66.  
  67.     }
  68.     SetBSP(binding);
  69. }
  70.